#include "DialogListado.h"
#include <gtkmm/messagedialog.h>


DialogListado::DialogListado(std::string titulo, std::string col1, std::string col2,
	Configuraciones** params, Gtk::Window& padre)
	: Dialog(titulo, padre, true),
	_grillaDatos(col1, col2)
{
	// Guarda una referencia a los parametros
	this->_ppConfig = params;

	// Primero se setean las propiedades de los contenedores
	this->_divisor.set_orientation(Gtk::ORIENTATION_HORIZONTAL);
	this->_contenedorBtns.set_orientation(Gtk::ORIENTATION_VERTICAL);
	this->_contenedorGrilla.set_orientation(Gtk::ORIENTATION_VERTICAL);

	this->_divisor.set_spacing(6);
	this->_contenedorBtns.set_spacing(6);
	this->_contenedorGrilla.set_spacing(6);

	// Se agregan los botones del cuadro de dialogo 
	this->add_button("Aceptar", Gtk::RESPONSE_OK);
	this->add_button("Cancelar", Gtk::RESPONSE_CANCEL);

	// Se configuran los botones que operan sobre la grilla
	this->_btnAgregar.set_label("Agregar");
	this->_btnEliminar.set_label("Eliminar");

	this->_btnAgregar.signal_clicked().connect(
		sigc::mem_fun(*this, &DialogListado::agregarFila) );
	this->_btnEliminar.signal_clicked().connect(
		sigc::mem_fun(*this, &DialogListado::eliminarFila) );

	// Se empaquetan los botones en su contenedor
	this->_contenedorBtns.pack_start(this->_btnAgregar, Gtk::PACK_SHRINK);
	this->_contenedorBtns.pack_start(this->_btnEliminar, Gtk::PACK_SHRINK);

	// Agrega la grilla a su contenedor 
	this->_contenedorGrilla.pack_start(this->_grillaDatos, Gtk::PACK_EXPAND_WIDGET);

	// Se agregan los contenedores a un divisor y este se agrega a la ventana
	this->_divisor.pack_start(this->_contenedorGrilla);
	this->_divisor.pack_start(this->_contenedorBtns, Gtk::PACK_SHRINK);

	Gtk::Box* pB = this->get_content_area();
	pB->pack_start(this->_divisor);

	// Setea el tamaño minimo para la ventana
	this->set_default_size(300, 200);

	// Muestra todos los items
	this->show_all_children();
}


DialogListado::~DialogListado(){
}


void DialogListado::agregarFila(){
	this->_grillaDatos.agregarFila();
}


void DialogListado::eliminarFila(){
	bool exito = this->_grillaDatos.eliminarFilaSeleccionada();
	if (!exito){
		// Muestra un mensaje de advertencia
		Gtk::MessageDialog msg(*this, "No se pudo borrar la fila");
		msg.set_secondary_text("No hay fila seleccionada");
		msg.run();
	}
}


void DialogListado::agregarDatos(std::string a, std::string b){
	this->_grillaDatos.agregarFila(a, b);
}


void DialogListado::abrirDialogo(){

	// Chequea si existen datos para cargar en la grilla
	if (*this->_ppConfig != NULL){
		setearParametros();
		this->set_response_sensitive(Gtk::RESPONSE_OK, true);
	} else {
		this->set_response_sensitive(Gtk::RESPONSE_OK, false);
	}

	// Muestra la ventana
	int resul = this->run();
	this->hide();

	if (resul == Gtk::RESPONSE_OK) aceptar();
	else cancelar();
}


void DialogListado::borrarDatos(){
	this->_grillaDatos.eliminarTodasFilas();
}


void DialogListado::obtenerDatosGrilla(std::map<std::string, std::string>& mapa){
	int i = 0;
	std::string a;
	std::string b;

	while ( this->_grillaDatos.obtenerFila(i, a, b) ) {
		i++;
		if (!a.empty() && !b.empty())
			mapa[a] = b;
	}
}


